---
#- dnf:
#    name: python3-psycopg2
#  become: yes

- name: >
    Доступность БД
    Проверка подключения к БД
  block:
    - name: Проверка подключения к БД postgres (по умолчанию)
      postgresql_ping:
        db: postgres
        login_host: postgres
        login_user: postgres
        login_password: postgres
      register: result
    - name: Доступность БД
      debug:
        msg: Подключение к БД прошло успешно
      when: result.is_available == true
    - fail: msg="Подключение к БД не прошло"
      when: result.is_available == false


- name: Удаление пользователя и БД
  block:
    # Удаление пользователя
    - name: >
        Удаление пользователя
        Для дальнейщего пересоздания
      postgresql_user:
        db: my_database
        name: my_user
        password: my_password
    #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: absent
      ignore_errors: yes

    # Удаление БД
    - name: Удаление БД my_database
      postgresql_db:
        name: my_database
    #    owner: my_user
    #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: absent
      ignore_errors: yes
#      check_mode: yes
          #playbook-1  | TASK [pgsql : Drop PostgreSQL database] ****************************************
          #playbook-1  | An exception occurred during task execution. To see the full traceback, use -vvv. The error was: DETAIL:  There are 3 other sessions using the database.
          #playbook-1  | fatal: [local]: FAILED! => {"changed": false, "msg": "Database query failed: database \"my_database\" is being accessed by other users\nDETAIL:  There are 3 other sessions using the database.\n"}

- name: Создание БД, схемы и ее владельца
  block:
    # Создание БД и назначение владельца схемы
    - name: Создание БД и назначение владельца схемы в БД my_database
      postgresql_db:
        name: my_database
        encoding: UTF-8
    #    owner: my_user
    #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: present

    # Создание пользователя
    - name: Создание пользователя my_user в БД my_database
      postgresql_user:
        db: my_database
        name: my_user
        password: my_password
    #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: present

    # Создание Схемы в БД
    - name: Создание Схемы my_schema в БД my_database
      postgresql_schema:
        name: my_schema
        db: my_database
        owner: my_user
    #    priv: "CONNECT/my_schema:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres

    # Предоставление владения схемой пользователю
    - name: Предоставление владения схемой пользователю
      postgresql_privs:
        database: my_database
        # schema: my_schema
        privs: "ALL"
        objs: my_schema
        type: schema
        roles: my_user
        grant_option: yes
        login_host: postgres
        login_user: postgres
        login_password: postgres

    # создание пользователя my_user2 в БД my_database
    - name: создание пользователя my_user2 в БД my_database
      postgresql_user:
        db: my_database
        name: my_user2
        password: my_password
    #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: present


    # выдача прав другому my_user2 с привелегиями ALL на схему my_schema
    - name: выдача прав другому my_user2 с привелегиями ALL на схему my_schema
      postgresql_privs:
        database: my_database
        # schema: my_schema
        privs: "ALL"
        objs: my_schema
        type: schema
        roles: my_user2
        grant_option: yes
        login_host: postgres
        login_user: postgres
        login_password: postgres

- name: Создание файла дампа схемы и востановление
  block:
    # Создание файла дампа БД
    - name: Создание файла дампа БД my_database schema my_schema
      postgresql_db:
        name: my_database
        state: dump
        target: /tmp/my_database_schema.tar
        target_opts: "-n my_schema"
        #    schema: my_schema
        login_host: postgres
        login_user: postgres
        login_password: postgres

    - name: Удаление схемы my_schema в БД my_database
      postgresql_schema:
        name: my_schema
        db: my_database
        state: absent
        cascade_drop: yes
        #    schema: my_schema
        login_host: postgres
        login_user: postgres
        login_password: postgres

    - name: Восстановление БД my_database с дампом my_database_schema.tar
      postgresql_db:
        name: my_database
        state: restore
        target: /tmp/my_database_schema.tar
        #    schema: my_schema
        login_host: postgres
        login_user: postgres
        login_password: postgres
          # TODO - необходимо иметь на машине делегате pg_dump, соответственно играть нужно на машине с postgresql-server /usr/bin/pg_dump
          # fixed - отсутствует pg_dump в контейнере ansible
          #playbook-1  | TASK [pgsql : Dump DB my_database] *********************************************
        #playbook-1  | fatal: [local]: FAILED! => {"changed": false, "msg": "Failed to find required executable \"pg_dump\" in paths: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}

- name: Создание файда дампа БД и востановление
  block:
    - name: Dump DB my_database
      postgresql_db:
        name: my_database
        state: dump
        target: /tmp/my_database.tar
        #    schema: my_schema
        login_host: postgres
        login_user: postgres
        login_password: postgres

    - name: Drop PostgreSQL database
      postgresql_db:
        name: my_database
        #    owner: my_user
        #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: absent
      ignore_errors: yes

    # Создание БД и назначение владельца
    - name: Create PostgreSQL database
      postgresql_db:
        name: my_database
        encoding: UTF-8
        #    owner: my_user
        #    priv: "CONNECT/my_database:ALL"
        login_host: postgres
        login_user: postgres
        login_password: postgres
        state: present

    - name: Restore DB my_database
      postgresql_db:
        name: my_database
        state: restore
        target: /tmp/my_database.tar
        #    schema: my_schema
        login_host: postgres
        login_user: postgres
        login_password: postgres

# Удаление БД
- name: Drop PostgreSQL database
  postgresql_db:
    name: my_database
    #    owner: my_user
    #    priv: "CONNECT/my_database:ALL"
    login_host: postgres
    login_user: postgres
    login_password: postgres
    state: absent
  #      ignore_errors: yes
#  check_mode: yes

- name: Выдача прав другому reader
  community.postgresql.postgresql_privs:
    db: library
    state: present
    priv: INSERT
    obj: books
    role: reader
    grant_option: false


...